# -*-coding=utf-8 -*-
"""
    @author:sirius
    @time:2018.4.20
"""
from common.util import get_event_list_by_period

# 使用UserFC进行推荐，输入：应用启动事件序列
def recommend_by_user_fc(PERIOD_FEATURE, APP_SYS_PATH, list_user2_score, dict_item2_users, user_id, neighbors):
    # neighborsTopK存储了相似度和邻居id的倒排表
    # 所以neighbor[1]表示邻居id，neighbor[0]表示相似度
    # 这里的推荐思路是：对于最近k邻居看过的所有电影中的某一电影m
    # 如果m仅仅被一个邻居看过，那么目标用户对此电影的的兴趣度就是目标用户和这个邻居的相似度
    # 如果m被多个邻居看过，那么目标用户对此电影的相似度为目标用户与这些邻居相似度之和
    # 建立推荐字典

    recommend_dict = {}
    for neighbor in neighbors:
        neighbor_user_id = neighbor[1]
        # 获取应用列表
        apps = get_event_list_by_period(PERIOD_FEATURE, APP_SYS_PATH, neighbor_user_id)

        # noinspection PyBroadException
        try:
            for app in apps:
                if app not in recommend_dict:
                    recommend_dict[app] = apps[app] * neighbor[0]
                else:
                    recommend_dict[app] += apps[app] * neighbor[0]
        except Exception as e:
            pass

    # 建立推荐列表
    recommend_list = []
    # 遍历从邻居获取的所有安装的应用信息
    for key in recommend_dict:
        # 遍历目标用户的安装信息和邻居安装应用信息作匹配
        for keyApp in list_user2_score[user_id]:
            if keyApp[1] == key and [recommend_dict[key], key] not in recommend_list:
                # 建立目标用户兴趣度-应用id的倒排表
                recommend_list.append([recommend_dict[key], key])
                break

    recommend_list.sort(reverse=True)
    # listUser2Score列表里边的元素是电影id到电影评分的键值对
    # 所以这里的k[0]表示一个应用ID，k[1]表示应用评分
    user_apps = [k for k in list_user2_score[user_id]]
    # recommend_list存储的是目标用户兴趣度到电影id的倒排表
    # 所以这里的的k[1]表示的是应用id，k[0]表示的是兴趣度
    # return [k[1] for k in recommend_list], user_apps, dictItem2Users, neighborsTopK
    return recommend_list, user_apps, dict_item2_users
